#pragma once
/*这个头文件里面封装了一些实用的工具类， 同时这些工具类
可以使用明明空间封装起来。*/

#include <iostream>
#include <ctime>
#include <string>
#include <sys/stat.h>

namespace mian_yang
{
    namespace util
    {
        /*第一个工具类是获取当前的时间， 这个
        工具类是用来获取当前程序出错的事件的*/
        class Date
        {
        public:
            static time_t GetTime()
            {
                return time(nullptr);
            }
        };

        /*第二个工具是创建文件的工具*/
        class File
        {
        public:
            static bool exists(const std::string &pathname)
            {
                /*判断文件是否存在*/
                /*遵循posix标准*的stat对象， 是一个
                和文件进行关联的兑现，里面保存了文件
                的各种信息*/
                struct stat st;
                /*利用stat函数和stat对象进行查找某个
                路径的文件是否存在*/   
                if (stat(pathname.c_str(), &st) < 0)
                {  
                    return false;
                }
                return true;
            }

            /*获取文件的路径*/
            static std::string path(const std::string& pathname)
            {
                /*从后向前找*/
                /*查找路径的时候， 利用/和\\获取路径*/
                int pos = pathname.find_last_of("/\\");               
                if (pos == std::string::npos)
                {
                    /*没有找到， 说明只有一个文件名， 那就
                    只能返回一个.*/
                    return ".";
                }
                else
                {
                    /*找到了， 就拿到路径*/
                    return pathname.substr(0, pos + 1);
                }
            }

            /*创建目录， 必须一层一层的创建。 */
            static void createDirectory(const std::string& pathname)
            {
                /*创建一个下标进行标记*/
                int index = 0;
                /*创建一个n用来表示文件的大小*/
                int n = pathname.size();
                while (index < n)
                {
                    /*从index的位置开始找，这个是找父级目录。
                    如果没找到父级目录， 那么就说明已经
                    到了最后一个文件了， 这个时候就不用
                    找了， 直接把文件创建了就行。*/
                    int pos = pathname.find_first_of("/\\"
                                                , index);
                    /*如果没找到， 那么就直接将整个目录的
                    文件创建出来*/
                    if (pos == std::string::npos)
                    {
                        mkdir(pathname.c_str(), 0777);
                        return;
                    }
                    /*到了这里说明还有父级目录， 那么就要
                    判断父级目录是否存在了， 因为是文件，
                    所以要判断刀腹肌目录的整个路径是否存在。
                    所以截取字符串从0截取， 一直截取到pos
                    位置*/
                    std::string parentpath = pathname.substr(0, pos + 1);
                    if (exists(parentpath))
                    {
                        index = pos + 1;
                    }
                    else 
                    {
                        mkdir(parentpath.c_str(), 0777);
                        index = pos + 1;
                    }                    
                }
            }
        };
    }
};